package com.cpimex.eprice;

import java.sql.*;
import java.util.*;
import com.cpimex.eprice.bean.GrupoBean;
import com.cpimex.eprice.bean.LineaBean;
import com.cpimex.eprice.bean.GrupoProdBean;

public class Grupo{

    public final String ACTUALIZAR = "actualizarGrupo";
    public final String EDITAR = "editarGrupo";
    public final String EDITARPROD = "editarProd";
    public final String ELIMINAR = "eliminarGrupo";
    public final String LISTAR   = "listarGrupo";
    public final String LISTARGPOPROD = "listGrupoProd";
    public final String LISTARPROD = "listProducto";
    public final String INSERTPROD = "insertProducto";
    public final String DELGPOPROD = "deleteProducto";


    public ArrayList listarGrupo(Statement stmt, String str_nomina) throws SQLException {
       ArrayList arr_grupo = new ArrayList();
       ResultSet rs = null;
       String str_query = " SELECT g.id_grupo, " +
                          "        g.desc_grupo," +
                          "        g.linea_grupo," +
                          "        CASE" +
                          "             WHEN SUM(pl.id_grupo) is null then 1 " +
                          "                     ELSE 0 " +
                          "             END borrar_grupo, " +
                          "        CASE " +
                          "             WHEN SUM(g.linea_grupo) is null then 1 "+
                          "                    ELSE 0 "+
                          "             END borrar_prod "+
                          " FROM ep_grupo g " +
                          "       LEFT JOIN ep_precioLista pl " +
                          "       ON g.id_grupo = pl.id_grupo " +
                          "       inner join ( "+
                          "                select	 top 1 codigo_clProd " +
                          "                from	 ep_claseProducto " +
                          "                where	 responsable_clProd = '"+str_nomina+"' " +
                          "                order by codigo_clProd " +
                          "        ) as ep_claseProducto on ep_claseProducto.codigo_clProd = g.claseProducto_grupo " +
                          " GROUP BY g.id_grupo, " +
                          "          g.desc_grupo, " +
                          "          g.linea_grupo " +
                          " ORDER BY g.desc_grupo ";

       rs = stmt.executeQuery(str_query);
       boolean bool_fila = false;

       while(rs.next()){
           GrupoBean bn_grupo = new GrupoBean();

           String str_idGrupo = rs.getString("id_grupo");
           String str_descGrupo = rs.getString("desc_grupo");
           String str_lineaGrupo = rs.getString("linea_grupo");
           int int_eliminar = rs.getInt("borrar_grupo");
           int int_editarProd = rs.getInt("borrar_prod");
           Map map_urlEliminar = new HashMap();
           Map map_urlActualizar = new HashMap();
           Map map_urlProducto = new HashMap();

           map_urlEliminar = mapa_editarMapa(str_idGrupo , ELIMINAR);
           map_urlActualizar = mapa_editarMapa(str_idGrupo, EDITAR);
           map_urlProducto = mapa_editarMapa(str_idGrupo, LISTARGPOPROD);
           map_urlProducto.put(EDITARPROD, String.valueOf(int_editarProd));


           bn_grupo.setStr_idGrupo(str_idGrupo);
           bn_grupo.setStr_descGrupo(str_descGrupo);
           bn_grupo.setStr_lineaGrupo(str_lineaGrupo);
           bn_grupo.setMap_urlActualizar(map_urlActualizar);
           bn_grupo.setMap_urlEliminar(map_urlEliminar);
           bn_grupo.setMap_urlProducto(map_urlProducto);
           bn_grupo.setBool_fila(bool_fila);
           bn_grupo.setInt_eliminar(int_eliminar);
           bn_grupo.setInt_eliminarProd(int_editarProd);

           bool_fila = !bool_fila;

           arr_grupo.add(bn_grupo);
       }
       rs.close();
       stmt.close();
       return arr_grupo;
   }

   public ArrayList listarLinea(Statement stmt, String str_linea) throws SQLException {
       ArrayList arr_linea = new ArrayList();
       String str_query = " SELECT id_linea, " +
                          "       desc_linea " +
                          " FROM ep_vw_linea " +
                          " WHERE id_linea not in " +
                          " (SELECT linea_grupo FROM ep_grupo WHERE linea_grupo is not null AND linea_grupo!= '"+str_linea+"') ";
       ResultSet rs = stmt.executeQuery(str_query);

       while(rs.next()){
           String str_idLinea = rs.getString("id_linea");
           String str_descLinea = rs.getString("desc_linea");

           if(str_descLinea==null)
               str_descLinea = "";

           LineaBean bn_linea = new LineaBean();
           bn_linea.setStr_idLinea(str_idLinea);
           bn_linea.setStr_descLinea("(" + str_idLinea + ") - " +str_descLinea);

           arr_linea.add(bn_linea);
       }
       return arr_linea;
   }


   public int eliminarGrupo(Connection conn, int int_idGrupo) throws
            SQLException {
        int int_rows;
        String str_query = " DELETE FROM ep_grupo  " +
                           " WHERE id_grupo =" + int_idGrupo + " ";
        Statement stmt = conn.createStatement();
        int_rows = stmt.executeUpdate(str_query);
        return int_rows;
   }

   public boolean actualizarGrupo(Connection conn, String str_idGrupo,
                              String str_descGrupo, String str_lineaGrupo)
           throws SQLException {
       boolean bool_status = false;
       bool_status = valida(conn, str_idGrupo, str_descGrupo, str_lineaGrupo);

       if (bool_status){
           String str_query = "UPDATE ep_grupo SET desc_grupo = '" + str_descGrupo + "', " +
                              " linea_grupo = " + (str_lineaGrupo.equals("")?" null ":" '" +str_lineaGrupo +"' ") + " " +
                              " WHERE id_grupo = '" + str_idGrupo + "' ";
           String str_queryDel = "DELETE FROM ep_grupoProducto WHERE id_grupo = '"+str_idGrupo+"' ";


           Statement stmt = conn.createStatement();
           if(!str_lineaGrupo.equals(""))
               stmt.executeUpdate(str_queryDel);
           stmt.executeUpdate(str_query);

           stmt.close();
           return bool_status;
       }else{
           return bool_status;
       }
   }

   public boolean insertarGrupo(Connection conn, String str_descGrupo, String str_lineaGrupo, String str_nomina) throws
            SQLException {
        boolean bool_status = valida(conn, "0", str_descGrupo, str_lineaGrupo);

        if(bool_status){
            String str_query =
            " INSERT INTO ep_grupo(desc_grupo, linea_grupo, claseProducto_grupo) " +
            " SELECT   top 1 "+
            "         '"+ str_descGrupo +"', "+
            "          " +(str_lineaGrupo.equals("")?" null ":" '" +str_lineaGrupo +"' ") + ", "+
            "          codigo_clProd "+
            " FROM     ep_claseProducto "+
            " WHERE    responsable_clProd = '"+str_nomina+"' "+
            " ORDER BY codigo_clProd ";
            Statement stmt = conn.createStatement();
            stmt.executeUpdate(str_query);
            stmt.close();
            return bool_status;
        }else{
            return bool_status;
        }
   }


   public ArrayList muestraGrupo(Statement stmt, int int_idGrupo) throws
            SQLException {

        ArrayList arr_grupo = new ArrayList();
        ResultSet rs = null;
        String str_query = "SELECT id_grupo, " +
                           " desc_grupo, " +
                           " linea_grupo " +
                           " FROM ep_grupo " +
                           " WHERE id_grupo = '" + int_idGrupo + "'";

        rs = stmt.executeQuery(str_query);

        while (rs.next()) {
            String str_idGrupo = rs.getString("id_grupo");
            String str_descGrupo = rs.getString("desc_grupo");
            String str_lineaGrupo = rs.getString("linea_grupo");
            if(str_lineaGrupo==null)
                str_lineaGrupo="";

            arr_grupo.add(str_idGrupo);
            arr_grupo.add(str_descGrupo);
            arr_grupo.add(str_lineaGrupo);

        }
        return arr_grupo;
    }

   
    private boolean valida(Connection conn, String str_idGrupo,
                           String str_descGrupo, String str_LineaGrupo) throws
            SQLException {
        int int_total = 0;
        Statement stmt_desc = conn.createStatement();
        Statement stmt_linea = conn.createStatement();
        ResultSet rs_desc = null;
        ResultSet rs_linea = null;

        String str_queryDesc = "SELECT COUNT(*) " +
                           " AS total " +
                           " FROM ep_grupo " +
                           " WHERE desc_grupo = '"+ str_descGrupo +"'  ";
        String str_queryLinea = "SELECT COUNT(*) " +
                                " AS total " +
                                " FROM ep_grupo " +
                                (str_LineaGrupo.equals("")?" WHERE linea_grupo is null ":" WHERE linea_grupo = '"+ str_LineaGrupo +"'  ");

        if(!str_idGrupo.equals("0")){
            str_queryDesc +=  " AND id_grupo != '"+ str_idGrupo +"'";
            str_queryLinea +=  " AND id_grupo != '"+ str_idGrupo +"'";
        }

        rs_desc = stmt_desc.executeQuery(str_queryDesc);
        while(rs_desc.next()){
            int_total = rs_desc.getInt("total");
        }
        if(int_total>0)
            return false;

        rs_linea = stmt_linea.executeQuery(str_queryLinea);
        while(rs_linea.next()){
           int_total = rs_linea.getInt("total");
       }
       if(!str_LineaGrupo.equals(""))
           if(int_total>0)
               return false;
       return true;
    }


    public ArrayList listadoGrpProd(Statement stmt, String str_idGrupo) throws
            SQLException {
        ArrayList arr_prodGrp = new ArrayList();
        String str_query = " SELECT codigo_prod," +
                           "        descripcion_prod " +
                           " FROM ep_vw_producto "+
                           " WHERE id_grupo = '" + str_idGrupo + "' ";

        ResultSet rs = stmt.executeQuery(str_query);

        boolean bool_fila = false;
        while (rs.next()) {
            String str_codigoProd = rs.getString("codigo_prod");
            String str_descripcionProd = rs.getString("descripcion_prod");
            Map map_url = new HashMap();

            map_url.put("action", DELGPOPROD);
            map_url.put("id_grupo", str_idGrupo);
            map_url.put("codigo_prod", str_codigoProd);

            GrupoProdBean bn_grupo = new GrupoProdBean();

            bn_grupo.setStr_codigoProd(str_codigoProd);
            bn_grupo.setStr_descripcionProd(str_descripcionProd);
            bn_grupo.setBool_fila(bool_fila);
            bn_grupo.setMap_url(map_url);

            bool_fila = !bool_fila;
            arr_prodGrp.add(bn_grupo);
        }
        return arr_prodGrp;
    }

    public ArrayList listarProducto(Statement stmt, String str_idGrupo, String str_search) throws SQLException {
        ArrayList arr_producto = new ArrayList();

        if(!str_search.equals("")){
            String str_query = " SELECT codigo_prod," +
                               "        descripcion_prod " +
                               " FROM   ep_vw_producto " +
                               " WHERE  id_grupo is null " +
                               " AND    (codigo_prod LIKE '%" + str_search + "%' OR " +
                               "        descripcion_prod LIKE '%" + str_search + "%') ";

            ResultSet rs = stmt.executeQuery(str_query);

            boolean bool_fila = false;
            while (rs.next()) {
                String str_codigoProd = rs.getString("codigo_prod");
                String str_descripcionProd = rs.getString("descripcion_prod");
                Map map_url = new HashMap();
                GrupoProdBean bn_grupo = new GrupoProdBean();

                map_url.put("action", INSERTPROD);
                map_url.put("codigo_prod", str_codigoProd);
                map_url.put("id_grupo", str_idGrupo);

                bn_grupo.setStr_codigoProd(str_codigoProd);
                bn_grupo.setStr_descripcionProd(str_codigoProd + " - " + str_descripcionProd);
                bn_grupo.setBool_fila(bool_fila);

                arr_producto.add(bn_grupo);

                bool_fila = !bool_fila;
            }
        }
        return arr_producto;
    }

    public void insertaProducto(Statement stmt,
                                 String[] str_select,
                                 String str_idGrupo) throws
            SQLException {

        if(str_select!= null){
            for(int int_i = 0 ; int_i<str_select.length; int_i++ ){
                String str_query = "INSERT INTO ep_grupoProducto " +
                           "       (codigoPro_grupoProducto, " +
                           "        id_grupo) " +
                           "        VALUES('"+str_select[int_i]+"', '"+str_idGrupo+"')";
                stmt.executeUpdate(str_query);
            }
        }
    }

    public void eliminaProducto(Statement stmt, String str_codigoProd) throws
            SQLException {
        String str_query = "DELETE FROM ep_grupoProducto " +
                           "       WHERE codigoPro_grupoProducto ='"+str_codigoProd+"' ";

        stmt.executeUpdate(str_query);
    }


    private Map mapa_editarMapa(String str_idGrupo , String str_accion){
       Map map_url = new HashMap();

       map_url.put("id_grupo", str_idGrupo);
       map_url.put("action", str_accion);

       return map_url;
   }

   public ArrayList buscarGrupo(Statement stmt, String str_search, String str_nomina) throws
            SQLException {
       ArrayList arrL_grupo = new ArrayList();
       String str_query = "SELECT id_grupo, " +
                           " desc_grupo, " +
                           " linea_grupo " +
                           " FROM ep_grupo " +
                           "       inner join ( "+
                           "                select	 top 1 codigo_clProd " +
                           "                from	 ep_claseProducto " +
                           "                where	 responsable_clProd = '"+str_nomina+"' " +
                           "                order by codigo_clProd " +
                           "        ) as ep_claseProducto on ep_claseProducto.codigo_clProd = ep_grupo.claseProducto_grupo " +
                           " WHERE desc_grupo LIKE '%" + str_search + "%' OR " +
                           "       id_grupo LIKE '%"+str_search+"%'";
        //System.out.println(str_query);

        if(!str_search.equals("")){
            ResultSet rs = stmt.executeQuery(str_query);
            while (rs.next()) {
                String str_idGrupo = rs.getString("id_grupo");
                String str_descGrupo = rs.getString("desc_grupo");
                String str_lineaGrupo = rs.getString("linea_grupo");
                if (str_lineaGrupo == null)
                    str_lineaGrupo = "";

                GrupoBean bn_grupo = new GrupoBean();
                bn_grupo.setStr_idGrupo(str_idGrupo);
                bn_grupo.setStr_descGrupo(str_descGrupo);
                bn_grupo.setStr_lineaGrupo(str_lineaGrupo);
                arrL_grupo.add(bn_grupo);
            }
        }
         return arrL_grupo;
   }
}
